package com.example.servicegateway.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Spring Cloud Gateway 配置类
 * 
 * 功能说明：
 * 1. 配置网关路由规则，定义请求如何转发到后端服务
 * 2. 配置全局过滤器和局部过滤器
 * 3. 配置跨域、限流、熔断等中间件功能
 * 4. 提供动态路由配置能力
 * 
 * @author Spring Cloud Demo
 * @version 1.0
 * @since 2024-01-01
 */
@Configuration
public class GatewayConfig {

    /**
     * 配置网关路由规则
     * 
     * 路由规则说明：
     * 1. 订单服务路由：/api/order/** -> service-order
     * 2. 商品服务路由：/api/product/** -> service-product
     * 3. 购物车服务路由：/api/cart/** -> service-product (购物车功能在商品服务中)
     * 
     * @param builder 路由构建器
     * @return 路由定位器
     */
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                // 订单服务路由配置
                .route("order-service", r -> r
                        .path("/api/order/**")  // 匹配以/api/order/开头的请求路径
                        .filters(f -> f
                                .stripPrefix(1)  // 去除路径前缀，将/api/order/xxx转发为/xxx
                                .addRequestHeader("X-Gateway-Source", "gateway")  // 添加请求头
                                .addResponseHeader("X-Gateway-Response", "true")   // 添加响应头
                        )
                        .uri("lb://service-order")  // 使用负载均衡转发到service-order服务
                )
                
                // 商品服务路由配置
                .route("product-service", r -> r
                        .path("/api/product/**")  // 匹配以/api/product/开头的请求路径
                        .filters(f -> f
                                .stripPrefix(1)  // 去除路径前缀
                                .addRequestHeader("X-Gateway-Source", "gateway")
                                .addResponseHeader("X-Gateway-Response", "true")
                        )
                        .uri("lb://service-product")  // 使用负载均衡转发到service-product服务
                )
                
                // 购物车服务路由配置（购物车功能在商品服务中）
                .route("cart-service", r -> r
                        .path("/api/cart/**")  // 匹配以/api/cart/开头的请求路径
                        .filters(f -> f
                                .stripPrefix(1)  // 去除路径前缀
                                .addRequestHeader("X-Gateway-Source", "gateway")
                                .addResponseHeader("X-Gateway-Response", "true")
                        )
                        .uri("lb://service-product")  // 转发到service-product服务
                )
                
                // 默认路由配置（可选）
                .route("default-route", r -> r
                        .path("/**")  // 匹配所有其他请求
                        .filters(f -> f
                                .addRequestHeader("X-Gateway-Source", "gateway")
                                .addResponseHeader("X-Gateway-Response", "true")
                        )
                        .uri("http://localhost:8081")  // 转发到默认服务
                )
                .build();
    }
} 